﻿// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include "refresh.h"


BOOL APIENTRY DllMain(HMODULE hModule,
                      DWORD ul_reason_for_call,
                      LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
#if _DEBUG
        // 首先尝试获取父进程的控制台输出，如果失败，则创建新的控制台
        if (!::AttachConsole(ATTACH_PARENT_PROCESS))
        {
            flag = CreateAndAttachConsole();
            // printf("Result of CreateAndAttachConsole(): flag = %s\n", flag ? "True" : "False");
        }
        printf("refresh.dll loaded.\n");
#endif // _DEBUG
        ResetMark();
        ResetFinData();
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    case DLL_PROCESS_DETACH:
#if _DEBUG
        printf("refresh.dll unloaded.\n");
        // 如果是dll文件创建的控制台窗口，则关闭控制台
        if (flag)
        {
            flag = FALSE;
            printf("You can now close the command line window manually.\n");
            FreeConsole();
        }
        // 恢复stdout和stderr到控制台
        // 恢复stdout和stderr到控制台
        // 使用_freopen_s代替freopen，并且检查指针是否为空
        {
            FILE *fp;
            freopen_s(&fp, "CONOUT$", "w", stdout);
            if (fp != stdout)
            {
                // 处理错误情况
            }
        }
        {
            FILE *fp;
            freopen_s(&fp, "CONOUT$", "w", stderr);
            if (fp != stderr)
            {
                // 处理错误情况
            }
        }
#endif // _DEBUG
        break;
    }
    return TRUE;
}
